/*
 * This file is Copyright 2002-2006 Loyola University Chicago,
 * Department of Computer Science and the Emerging Technologies Laboratory.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License via
 *    http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.citep.web.admin.users.client;

import java.util.HashMap;

import com.citep.web.admin.accounts.client.AccountService;
import com.citep.web.admin.accounts.client.AccountServiceAsync;
import com.citep.web.gwt.dto.HistoryEncoder;
import com.citep.web.gwt.dto.UserDTO;
import com.citep.web.gwt.module.BaseApplication;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

public class UserLoginApplication extends BaseApplication {
	private UserLoginPresentation presentation;
	
	private AsyncCallback authenticateCallback;

	private AccountServiceAsync accountsService;
	private HashMap roleMap = new HashMap(); //maps role names to role objects

	private UserDTO currentUser = new UserDTO(); //user we are currently editing
	
	public UserLoginApplication() {
		accountsService = (AccountServiceAsync)GWT.create(AccountService.class);
		((ServiceDefTarget)accountsService).setServiceEntryPoint(GWT.getModuleBaseURL() + "/accounts");
	}
	
	protected AsyncCallback getAuthenticateCallBack() {
		if(authenticateCallback == null) {
			authenticateCallback = new AsyncCallback() {
				public void onSuccess(Object result) {
					presentation.setReadyState();
					if(result == null) {
						presentation.displayError("Invalid email/password");
					} else {
						presentation.displayStatus("Logging in...", 0);
						String token = HistoryEncoder.encode("account_entry", null);
						History.newItem(token);
					}
				}
				
				public void onFailure(Throwable caught) {
					presentation.setReadyState();
					processException(presentation,caught);
				}
			};
		}
		
		return authenticateCallback;
	}

	
	public void setPresentation(UserLoginPresentation presentation) {
		this.presentation = presentation;
	}

	public void authenticate(String email, String password) {
		presentation.setWaitState();
		accountsService.login(email, password, getAuthenticateCallBack());
	}
	
}